// 商品路由表

// 加载模块
const express = require('express');
const goodsModel = require('../db/models/goodsModel.js');
const path = require('path');

// 创建路由表
let router = express.Router();

// 向路由表添加内容：

router.post('/add',(req,res)=>{// f5
    // 获取参数并解构赋值
    let {name,price,desc,type,imgurl} = req.body;

    // 校验数据（空值判断）
    if (!name || !price || !desc || !type || !imgurl) {
        return res.send({"code":-1,"msg":"添加商品内容不能为空！"});
    }

    // 先查询数据库，判断是否已有该商品
    goodsModel.find({name})
    .then((arr)=>{
        if (arr.length === 0) {
            // 数据库没有该商品，可以添加商品
            return goodsModel.insertMany({name,price,desc,type,imgurl});
        } else {
            // 数据库有该商品，不可以添加商品
            res.send({"code":-2,"msg":"该商品已存在！"});
            return new Promise(()=>{});// 终止链式调用
        }
    })
    .then(()=>{
        res.send({"code":1,"msg":"添加商品成功！"});
    })
    .catch((err)=>{
        res.send({"code":0,"msg":err});
    });
})

router.get('/del',(req,res)=>{// f6
    // 获取参数
    let {name} = req.query;

    // 删除数据
    goodsModel.deleteOne({name})
    .then((result)=>{
        if (result.deletedCount === 1) {
            // 删除成功
            res.send({"code":1,"msg":"删除商品成功！"});
        } else {
            // 删除失败
            res.send({"code":0,"msg":"删除商品失败！"});
        }
    })
    .catch((err)=>{
        res.send({"code":-1,"msg":err});
    })
})

router.post('/udate',(req,res)=>{// f7
    // 获取参数
    let {oname,name,price,desc,type,imgurl} = req.body;
    console.log( oname,name,price,desc,type,imgurl );

    // 修改数据
    goodsModel.updateOne({name:oname},{$set:{name,price,desc,type,imgurl}})
    .then((result)=>{
        console.log( result );
        if (result.modifiedCount === 1) {
            // 修改成功
            res.send({"code":1,"msg":"修改成功"});
        } else {
            // 修改失败
            res.send({"code":-1,"msg":"修改失败"});
        }
    })
    .catch((err)=>{
        res.send({"code":-1,"msg":err});
    })
})

// 关键字查询/模糊查询
router.get('/search',(req,res)=>{// f8
    // 获取参数
    let {kw} = req.query;

    // 匹配关键字的正则
    // let regKW = /kw/i;// 规则匹配 'kw' 这两个字符串
    let regKW = new RegExp(kw,'i');// 规则匹配 kw 变量的值

    // 查询数据库
    goodsModel.find({$or:[{name:{$regex:regKW}},{price:{$regex:regKW}},{desc:{$regex:regKW}},{type:{$regex:regKW}}]})
    .then((arr)=>{
        if (arr.length === 0) {
            res.send({"code":0,"msg":"暂无数据！","data":[]});
        } else {
            res.send({"code":1,"msg":"查询成功！","data":arr});
        }
    })
    .catch((err)=>{
        res.send({"code":-1,"msg":"查询失败！","data":[]});
    })
})

// 分页查询
router.get('/getpage',(req,res)=>{
    // 获取参数
    let {page=1,size=4} = req.query;
    // page 第几页数据
    // size 每页几条数据

    let pages = 0;// 记录总页数
    let count = 0;// 记录总条数

    // 查询所有数据
    goodsModel.find()
    .then((arr)=>{
        count = arr.length;
        pages = Math.ceil(count/size);

        // find()查询所有数据
        // limit(4)限制查询4条数据
        // skip(4)跳过4条数据，从第5条开始查询 
        // find().limit(4).skip(0) 查询第1页
        // find().limit(4).skip(4) 查询第2页
        // find().limit(4).skip(8) 查询第3页
        // 。。。
        // find().limit(size).skip((page-1)*size)

        goodsModel.find().limit(size).skip((page-1)*size)
        .then((arr)=>{
            res.send({"code":1,"msg":"查询成功","data":arr,pages,count});
        })
        .catch((err)=>{
            res.send({"code":0,"msg":err,"data":[],"pages":0,"count":0});
        })
    })
})


// 后端使用multer插件来接收FormData数据
// 安装插件：npm i multer
const multer = require('multer');

/* // 创建一个接收器（接收文件）
let uploadFun = multer({
    dest: './www/uploads'// 接收文件的存储目录
});

// 上传文件接口
router.post('/upload',uploadFun.single('upfile'),(req,res)=>{
    // 执行uploadFun.single('upfile')接收文件之后，在请求对象req中有一个file属性
    console.log( req.file );
    // req.file = {
    //     fieldname: 'upfile',
    //     originalname: '02.jpg',
    //     encoding: '7bit',
    //     mimetype: 'image/jpeg',
    //     destination: './www/uploads',
    //     filename: 'bff00c2c0366fd3f5eb87afc4803d14d',
    //     path: 'www\\uploads\\bff00c2c0366fd3f5eb87afc4803d14d',
    //     size: 50687
    // }
    res.send('upload is ok');
}) */


// 创建一个接收器（接收文件）
let upload = multer({
    // dest: './www/uploads'// 接收文件的存储目录(简单设置)
    limits: {
        // 限制上传文件最大为400kb
        fileSize: 1024 * 400
    },
    fileFilter: function (req,file,cb){
        // 限制上传文件的类型（只能上传图片）
        let reg = /.(png|gif|jpe?g|svg)$/;
        if (reg.test(file.originalname)) {
            // 是图片类型，接收文件
            cb(null,true);
        } else {
            // 不是图片类型，拒收文件
            cb(null,false);
        }
    },
    // 设置文件存储（文件名、存储路径）
    storage: multer.diskStorage({
        destination: function (req, file, cb) {
            // cb函数的作用是设置文件的存储目录
            cb(null, './www/uploads');
        },
        filename: function (req, file, cb) {
            // console.log( req );
            // console.log( file );
            // file = {
            //     fieldname: 'upfile',
            //     originalname: '03.png',
            //     encoding: '7bit',
            //     mimetype: 'image/png'
            // }
            // cb函数的作用是设置文件的名称
            // cb(null, 'hehe.jpg');// 固定名称会发生覆盖

            // 从上传文件的file对象中获取文件的原始后缀名
            let hzm = path.extname(file.originalname);// '.png'  '.jpg'

            // 随机生成一个文件名（确保不重复）
            // '16986456456_26865.png'
            let filen = Date.now()+'_'+parseInt(Math.random()*100000)+hzm;

            // 设置上传文件的名称
            cb(null, filen);
        }
    })
});

// 接收文件
let uploadFun = upload.single('upfile');

// 上传文件接口
router.post('/upload',(req,res)=>{
    // 执行uploadFun.single('upfile')接收文件之后，在请求对象req中有一个file属性
    // console.log( req.file );
    // req.file = {
    //     fieldname: 'upfile',
    //     originalname: '03.png',
    //     encoding: '7bit',
    //     mimetype: 'image/png',
    //     destination: './www/uploads',
    //     filename: 'hehe.jpg',
    //     path: 'www\\uploads\\hehe.jpg',
    //     size: 262971
    // }

    // 等待接收结果
    uploadFun(req,res,(err)=>{
        // 接收完成后执行该函数
        // err 在正常接收到文件时为null，接收文件失败时为错误对象
        if (err) {
            return res.send({"code":-1,"msg":"上传文件不能大于400kb"});
        }

        // 如果上传文件类型不符合要求时，文件被拒绝接收，req.file = undefined
        if (!req.file) {
            return res.send({"code":-2,"msg":"只能上传图片类型的文件"});
        }

        // 上传文件成功，将图片地址返回给前端
        let imgurl = 'http://localhost:9090/static/uploads/'+req.file.filename;
        // 'http://localhost:9090/static/uploads/1695109582528_87194.jpg'
        res.send({"code":1,"msg":"图片上传成功","imgurl":imgurl});
    })
})


// 对外暴露接口
module.exports = router;
